#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

class fmap
{
private:
    int flag=0;
    
public:
    vector<int> allI;
    vector<int> allJ;
    vector<int> allR;
    
    int get(int i,int j)
    {
        for(int ii=flag;ii<allI.size();ii++)
        {
            if(allI[ii]==i && allJ[ii]==j)
            {
                return allR[ii];
                flag=ii; //一个只会被它后面那个用，所以用过了就不会被再用
            }
        }
        add(i,j,0);
        return 0;
    }
    
    void add(int i,int j,int r)
    {
        allI.push_back(i);
        allJ.push_back(j);
        allR.push_back(r);
    }
    
    void set(int i,int j,int r)
    {
        for(int ii=0;ii<allI.size();ii++)
        {
            if(allI[ii]==i && allJ[ii]==j)
            {
                allR[ii]=r;
                return;
            }
        }
        add(i,j,r);
    }
};

fmap dp;

int main()
{
    string a,b;
	cin>>a>>b;
	
	int r=0;
	a = " " + a, b = " " + b; //防数组越界（第一位相等时）
	for (int i = 1;i < a.size();i++)
	{
	    for (int j = 1;j < b.size();j++)
		{
			if (a[i] == b[j])
			{
				int getr = dp.get(i-1,j-1) + 1; //更新以i j结尾时长度
				dp.add(i,j,getr); //一定是最新的
				r = max(r, getr); //更新最长长度
		    }
		}
	}
	cout<<r<<endl;
}